{{tag>messagerie courriel postfix MTA serveur BROUILLON}}

====== Installer Postfix avec le serveur de messagerie du réseau local ou sur internet ======
Pour communiquer directement avec un serveur de messagerie internet ou du [[https://fr.wikipedia.org/wiki/R%C3%A9seau_local|LAN]]. C'est la configuration «système satellite».

Pour plus d'informations sur la messagerie lire [[:comment_fonctionne_le_courriel_sous_linux|Comment fonctionne le courriel sous Linux ?]], et sur les principes du serveur Postfix lire [[:comment_configurer_sa_distribution_de_courriels_systemes_mta|Comment configurer sa distribution de courriels systèmes MTA avec Postfix ?]]

===== Installation du serveur de messagerie Postfix =====
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]] du serveur de messagerie **[[apt>postfix|postfix]]**.
Choisir «pas de configuration» si l'installation demande de paramétrer le serveur de messagerie.

{{ :doc:02_pasdeconfiguration.png?nolink&600 |}}

Pour la partie sécurité du serveur [[:tutoriel:comment_installer_un_paquet|installez les paquets]] **[[apt>libsasl2-modules,libauthen-sasl-cyrus-perl, |libsasl2-modules libauthen-sasl-cyrus-perl]]**.

Installer le client [[mutt|Mutt]] de messagerie MUA **[[apt>mutt|mutt]]** (les clients MUA de mailutils et de bsd-mailx ne supportent que le format mbox pour la gestion locale, vous pouvez aussi utiliser [[https://neomutt.org|Neomutt]] avec plus de fonctionnalités en remplacement de Mutt **[[apt>neomutt|Neomutt]]**).




===== Définir le gestionnaire de messagerie =====
**Vous devez définir qui va avoir la supervision de la messagerie**. Donc si l'utilisateur root est le superviseur de la messagerie, ou si c'est un utilisateur du système (serveur ou desktop Linux). Le fichier **/etc/aliases** (''kate /etc/aliases'') est à paramétrer comme suit.

Avec l'utilisateur directement gestionnaire de messagerie :
<file>postmaster:    utilisateur</file>

Avec l'utilisateur gestionnaire de la machine Linux (relais postmater à l'utilisateur root) :
<file>postmaster:    root
root:    utilisateur</file>

Valider dans Postfix la configuration :
<code bash>sudo postalias /etc/aliases</code>

<note warning>Par défaut, lors de la configuration du serveur de messagerie, celui-ci sera positionné avec l'utilisateur root</note>

===== Configuration de Postfix avec un serveur du réseau local ou sur Internet =====

Pour configurer postfix, tapez :
<code bash>sudo dpkg-reconfigure postfix</code>

{{ :doc:02_systemesatellite.png?nolink&600 |}}
Saisissez Système satellite

{{ :doc:03_nomducourriel_perso-fr.png?nolink&600 |}}
Remplacez perso.fr par votre nom de domaine de machine

{{ :doc:12_reseauxrelais_smtp-fai-fr.png?nolink&600 |}}
Indiquez ici le nom du serveur de relaie smtp de votre réseau local ou d'internet (ici cas avec Gmail)

{{ :doc:04_adminserveur_internet.png?nolink&600 |}}
Le compte de messagerie internet de l'administrateur de la machine que vous avez défini ([[:comment_configurer_sa_distribution_de_courriels_systemes_mta#definir_le_gestionnaire_de_messagerie|ne pas oublier d'avoir fait la configuration du gestionnaire avant]]) doit être saisie ici.

{{ :doc:05_domainesmessagerie_defaut.png?nolink&600 |}}
Laissez ce champ vide

{{ :doc:06_synchrofileattente.png?nolink&600 |}}

{{ :doc:07_reseauxdistribution_local.png?nolink&600 |}}

{{ :doc:08_taillebal.png?nolink&600 |}}

{{ :doc:09_extadresse.png?nolink&600 |}}

{{ :doc:10_protocoles.png?nolink&600 |}}

===== Configurer le client mail MUA système =====
Testez la lecture de la boîte aux lettres :
<code bash>mutt</code>

Si vous avez un message du genre :
<code>/home/utidisateur/Mail n'existe pas. Le créer ? ([oui]/non):</code>
C'est que votre client mail est mal configuré.

Tapez : <code>n</code> puis pour quitter Mutt <code>q</code>

==== Configuration du client de courriels ====

Éditer le fichier .muttrc dans votre dossier /home/utilisateur (''kate ~/.muttrc'')
Et ajouter ou modifier ces lignes :
<file># Configuration de base
set realname="{Prénom NOM}"
set header_cache=~/.mutt/cache/headers
set certificate_file=~/.mutt/certificates
set message_cachedir=~/.mutt/cache/bodies
set beep
set use_from = yes

# Boite de réception
set spoolfile=~/.local/share/courriels/arrivées/
# Boite aux lettres de Mutt
set folder=~/.local/share/courriels

# Autres dossiers
set postponed=+brouillons
set record=+envoyés

# Encodage à utiliser
set charset=utf-8
set send_charset=utf-8
# Format de la date à afficher avant les citations lors d'une réponse
set date_format="%A %d %B %Y à %I:%M:%S%p"
set index_format="%4C %Z %{%b %d} %-15.15F (%4l) %s"
set fast_reply
set include=yes

# Configuration SMTP
set sendmail="/usr/sbin/sendmail"
</file>

===== Emplacement des boîtes aux lettres des utilisateurs du système =====
Nous remarquons que le «configurateur» de Postfix n'a pas demandé de préciser où les boîtes aux lettres des utilisateurs sont situées. 

La commande de la file d'attente :
<code bash>postconf queue_directory</code>
renvoie
<code>queue_directory = /var/spool/postfix</code>

La commande de boîtes postales :
<code bash>postconf mail_spool_directory</code>
renvoie
<code>mail_spool_directory = /var/mail</code>

Si on passe la commande de boîtes aux lettres utilisateurs :
<code bash>postconf home_mailbox</code>
Nous avons :
<code>home_mailbox =</code>
Nous voyons alors que les boîtes aux lettres des utilisateurs sont des boîtes postales et se situent dans /var/mail/utilisateur.

Il nous faudra donc éditer le fichier /etc/postfix/main.cf (''kate /etc/postfix/main.cf'') et ajouter la variable **home_mailbox** pour vos utilisateurs.

Par exemple :
<file># au format maildir
home_mailbox = .local/share/courriels/arrivées/</file>
ou passer la commande dans un terminal :
<code bash>sudo postconf -e home_mailbox=.local/share/courriels/arrivées/</code>
afin que le courriel soit directement distribué dans la boîte aux lettres locale de l'utilisateur.

Pour valider la configuration dans Postfix, tapez :
<code bash>systemctl restart postfix</code>

===== Bloquer le port 25 SMTP standard =====
==== Test de la connexion sur le port 25 ====
Déjà testons que le port 25 est ouvert.
Pour cela tapez la commande :
<code bash>telnet localhost 25</code>

Ce qui affiche
<code>Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Ma-Machine ESMTP Postfix (Ubuntu)</code>

Tapez :
<code>HELO Ma-Machine</code>
retourne
<code>250 Ma-Machine</code>

Puis saisissez l'identifiant d'un compte local :
<code>MAIL FROM: utilisateur</code>
retourne
<code>250 2.1.0 Ok</code>

Saisissez le destinataire :
<code>RCPT TO: utilisateur@localhost</code>
retourne
<code>250 2.1.5 Ok</code>

Saisissez :
<code>DATA</code>
retourne
<code>354 End data with <CR><LF>.<CR><LF></code>

Et enfin vous pouvez saisir votre courriel :
<code>From: utilisateur
To: utilisateur
Subject: Test de message sur port 25
Ceci est un test d'envoie sur port 25
Merci de votre coopération
.</code>
retourne
<code>250 2.0.0 Ok: queued as 9E77AA02321</code>

Pour quitter tapez :
<code>QUIT</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>

Vous avez expédié un courriels local :-)

==== Blocage du port 25 ====
Modifier le fichier master.cf (''kate /etc/postfix/master.cf'')
<file>#smtp      inet  n       -       y       -       -       smtpd</file>

Redémarrage de Postfix pour valider les changements :
<code bash>systemctl restart postfix</code>

==== Test du verrouillage du port 25 ====
Pour cela taper :
<code bash>telnet localhost 25</code>
retourne
<code>Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused</code>

===== Mettre en place la connexion TLS pour votre trafic SMTP =====
Par défaut le configurateur configure TLS comme ci-dessus :
<file># TLS paramètres du serveur smtpd de Postfix
smtpd_tls_security_level=may
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

# TLS paramètres du client smtp de Postfix
smtp_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
</file>

==== Configuration d'un trafic TLS pur ====
Pour valider le transport [[https://fr.wikipedia.org/wiki/Transport_Layer_Security|TLS]] il faut modifier le fichier main.cf (''kate /etc/postfix/main.cf'') comme suit :
<file># TLS pour le serveur smtpd de Postfix
# Utilise le générateur de nombres aléatoires de Linux
tls_random_source = dev:/dev/urandom
# Active le protocole de cryptage TLS
smtpd_use_tls = yes
# N'autorise que les connections TLS
smtpd_tls_auth_only = yes
# Niveau de sécurité dans la négociation du protocole
smtpd_tls_security_level = may
# Les clefs du cryptage
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/certs/ssl-cert-snakeoil.key

# TLS pour le client
# Active le protocole de cryptage TLS
smtp_use_tls = yes
# Niveau de sécurité dans la négociation du protocole
smtp_tls_security_level = may
# Les clefs du cryptage
smtp_tls_CApath = /etc/ssl/certs
# Répertoire de cache pour la communication
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache</file>

==== Autoriser les connections TLS ====
Pour cela il faut modifier le fichier master.cf (''kate /etc/postfix/master.cf'')

Modifier le fichier comme ci-dessous :
<file>submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
</file>

Redémarrer Postfix :
<code bash>systemctl restart postfix</code>

==== Vérifier le blocage des connexions non TLS ====
Tester la connexion telnet :
<code bash>telnet localhost 587</code>
retourne                                
<code>Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Ma-Machine ESMTP (Courriels)</code>

Taper :
<code>ehlo Ma-Machine</code>
retourne
<code>250-Ma-Machine
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING</code>

Taper :
<code>MAIL FROM: utilisateur</code>
retourne
<code>530 5.7.0 Must issue a STARTTLS command first</code>

Taper :
<code>quit</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>

==== Vérifier les connexions TLS ====
Pour vous connecter en TLS :
<code bash>openssl s_client -starttls smtp -connect localhost:587</code>
retourne
<code>CONNECTED(00000003)
…
    Start Time: 1598437512
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK</code>

Tapez :
<code>ehlo Ma-Machine</code>
retourne
<code>250-Ma-Machine
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING</code>

Tapez :
<code>MAIL FROM: utilisateur</code>
retourne
<code>250 2.1.0 Ok</code>

Tapez :
<code>QUIT</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>
Vos échanges de courriels sont maintenant cryptés lors du transport en SMTP. 
===== Mettre en place l'authentification SASL =====

Pour valider la configuration dans Postfix, tapez :
<code bash>systemctl restart postfix</code>

=== Exemple avec Gmail ===
Pour configurer Gmail en relaie SMTP
== Création du mot de passe applicatif ==
{{ :doc:1_accesconfigcompte.png?nolink |}}

Cliquez sur {{:doc:2_gerercomptegoogle.png?nolink|}}

{{ :doc:3_menuinformationscompte.png?nolink |}}

Cliquez sur {{:doc:4_securite.png?nolink|}}

{{ :doc:5_connexionagoogle.png?nolink |}}

Cliquez sur {{:doc:6_motdepasseapplications.png?nolink|}}

{{ :doc:7_fenetremotdepasseapplications.png?nolink |}}

Cliquez sur **Sélectionnez un application** pour afficher le menu  {{:doc:8_selectionapplication.png?nolink|}}

Saisissez le nom Postfix de votre serveur de messagerie pour Google {{:doc:9_saisienomserveurpostfix.png?nolink|}}

Cliquez sur {{:doc:10_generer.png?nolink|}}

Notez le mot de passe générez {{:doc:11_motdepasseapplication.png?nolink|}}

{{ :doc:12_resultat.png?nolink |}}
Vous avez créé votre mot de passe sécurité Google pour votre application Postfix.

==== Configuration des identifiants du serveur ====
Éditez le fichier /etc/postfix/sasl/sasl_passwd (''kate /etc/postfix/sasl/sasl_passwd'') :
<file>[smtp.gmail.com]:587    mon_compte_gmail:mdp_applicatif_google</file>

Passez la commande pour valider le mot de passe avec Postfix :
<code bash>sudo postmap /etc/postfix/sasl_passwd</code>

=== Exemple avec Gmail ===
<file>[smtp.gmail.com]:587    utilisateur@gmail.com:ygvpyhldoiqujhth</file>

==== Configuration de Postfix ====
Modifiez /etc/postfix/main.cf (''kate /etc/postfix/main.cf''):
<file># Les interfaces réseau par lesquelles le système de messagerie reçoit les messages.
inet_interfaces = loopback-only
# La machine par défaut où livrer le courrier au départ lorsqu'il n'y a aucune destination locale d'arrivée (mydestination).
relayhost = [smtp.gmail.com]:587
# Gmail
# Active l'authentification SASL
smtp_sasl_auth_enable = yes
# Désactive l'authentification anonyme
smtp_sasl_security_options = noanonymous
# Pour corriger des erreurs d'authentification SASL avec GMAIL
smtp_sasl_mechanism_filter = plain
# Location de l'indentifiant SASL
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
# Active le crytage STARTTLS
smtp_tls_security_level = encrypt
# Location du certificat CA
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
</file>

À ce stade, si on redémarre le service Postfix, l'envoie de messages fonctionnent. Mais nous allons obtenir un message d'erreur sur l'expéditeur dans notre client de messagerie MUA à la réception du message.
{{ ::adresseexpincorrecte.png?nolink&600 |}}

Il faut, pour éviter cela, substituer le nom d'expéditeur avec le nom de l'adresse de messagerie du serveur de messagerie pour lequel on envoie le courriel.

Éditez le fichier generic (''kate /etc/postfix/generic'') et modifiez le comme suivant :
<file>utilisateur@mon_nom_machine             username@gmail.com
utilisateur@localhost                   username@gmail.com
utilisateur@mondomainemessagerie.fr     username@gmail.com 
root@mondomainemessagerie.fr            username@gmail.com
sudoer@mondomainemessagerie.fr          username@gmail.com</file>

Validez pour Postfix les substitutions :
<code bash>sudo postmap /etc/postfix/generic</code>

Ajoutez dans main.cf (''kate /etc/postfix/main.cf'') :
<file>smtp_generic_maps = hash:/etc/postfix/generic</file>

Redémarrer Postfix :
<code bash>systemctl restart postfix</code>

==== Débogage en cas de problèmes ====

=== Vérifier l'accès TLS ===
Pour vérifier que la connexion TLS de Gmail fonctionne tapez :
<code bash>openssl s_client -starttls smtp -connect smtp.gmail.com:587</code>
Qui doit donner en sortie:
<code bash>CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = smtp.gmail.com
verify return:1
---
Certificate chain
 0 s:C = US, ST = California, L = Mountain View, O = Google LLC, CN = smtp.gmail.com
   i:C = US, O = Google Trust Services, CN = GTS CA 1O1
 1 s:C = US, O = Google Trust Services, CN = GTS CA 1O1
   i:OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
…
-----END CERTIFICATE-----
subject=C = US, ST = California, L = Mountain View, O = Google LLC, CN = smtp.gmail.com

issuer=C = US, O = Google Trust Services, CN = GTS CA 1O1

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2893 bytes and written 429 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
250 SMTPUTF8
</code>

Tapez **quit** pour finir la session :
<code bash>quit</code>

Ce qui donne comme résultat :
<code bash>---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: …
    Session-ID-ctx: 
    Resumption PSK: …
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 172800 (seconds)
    TLS session ticket:
    …

    Start Time: 1597667889
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: …
    Session-ID-ctx: 
    Resumption PSK: …
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 172800 (seconds)
    TLS session ticket:
    …
    Start Time: 1597667889
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
221 2.0.0 closing connection 68sm31076964wra.39 - gsmtp
read:errno=0</code>

=== Vérifier l'autentification au serveur SMTP de Gmail ===
Creer un Hash (code crypté de connexion) pour votre identifiant Gmail et votre mot de passe applicatif.
<code bash>python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"mon_compte_gmail:mdp_applicatif_google", encoding="ascii")).decode("ascii"))'</code>
Soit pour notre exemple :
<code bash>python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"utilisateur@gmail.com:ygvpyhldoiqujhth", encoding="ascii")).decode("ascii"))'</code>

ou en perl:
<code bash>perl -MMIME::Base64 -le 'print encode_base64("utilisateur\@gmail.com:ygvpyhldoiqujhth");'</code>

Ce qui donne en sortie :
<code>dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=</code>

Pour vérifier qu'il n'y a pas d'erreurs :
<code bash>python3 -c 'import sys; from base64 import b64decode; print(b64decode("dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=").decode("ascii"))'</code>

ou en perl
<code bash>perl -MMIME::Base64 -le 'print decode_base64("dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=");'</code>

Pour vous connecter avec cet identifiant crypté :
<code bash>openssl s_client -starttls smtp -connect smtp.gmail.com:587</code>

Puis saisissez : 
<code>ehlo domain
250-localpart.domain.part
250-PIPELINING
250-SIZE 31457280
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN</code>

Maintenant c'est le code de Hash de l'identifiant mot de passe applicatif Google qu'il faut saisir :
<code>AUTH PLAIN dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=</code>

Vérifiez alors que vous avez la ligne :
<code>235 2.7.0 Authentication successful</code>
